この質問にはすでにここに答えがあります: オーバーロードされた演算子で暗黙の変換はありません (2つの答え) 7年前に閉鎖されました。 私は基本型の単純なラッパーを作成しており、標準演算子のフレーバーをあまり多く作成する必要がないようにしています。暗黙の型変換が役立つことを望んでいましたが、そうではありません。簡略化した例を次に示します。 struct Int {{ int _i; Int(int i = 0):_ i {i} {} Int operator +(const Int&rhs){return _i + rhs._i;} }; int main(int argc、char * argv []) {{ (void)(Int(1)+ 2); //罰金 (void)(2 + Int(1)); //エラー:バイナリ式のオペランドが無効です( 'int'および 'Int') } 私はllvmを使用しています。 mainの最初の行は正常にコンパイルされます。 2番目はエラーを引き起こします。さて、2行目で起こることを望んでいたのは、2が暗黙的にInt(2)に変換され、続いてoperator +が呼び出されることです。なぜそれが起こらないのですか?最初の行で暗黙的な変換が行われるのはなぜですか?
2021-03-01 08:17:58
使用可能なoperator +はoperator +(Int&)(このインスタンスのIntの暗黙の最初のパラメーターを持つ)のみであるため、最初の行で発生します。最初のパラメーターがintであり、操作を試行する前に変換する必要があるという手がかりがないため、2行目は失敗します(Int :: operator +を使用する必要があるかどうかはわかりません)。 演算子を非メンバーフレンド関数にすることで、この問題を回避できます(http://ideone.com/YCf7wX) struct Int {{ int _i; Int(int i = 0):_ i {i} {} フレンドInt演算子+(const Int&lhs、const Int&rhs); }; Int演算子+(const Int&lhs、const Int&rhs) {{ lhs._i + rhs._iを返します。 } int main() {{ Int i; i + 5; 5 + i; 0を返します。 } | あなたが探している答えではありませんか? c ++ operator-keywordimplicit-conversionのタグが付いた他の質問を参照するか、独自の質問をしてください。